PolarsのList: 特定の条件を満たした要素を含む行を抽出する
from PolarsでListを扱う
例えば、文字列リストのカラムに対して、aから始まるものを含んでいる行を抽出したい
code:py
df = pl.DataFrame(
{
"id": 1, 2, 3, 4, 5,
"tags": [
"apple", "banana", "cherry",
"grape", "banana", "apple",
"peach", "plum", "pear",
"apple", "avocado", "apricot",
"mango", "melon", "apple",
],
}
)
https://gyazo.com/e30e008a7927afd069c83206933dfde0
polars.Expr.list.eval()が使える
pl.element経由で普通に.strを扱えるようになる
code:py
df.filter(
pl.col("tags").list.eval(pl.element().str.contains("^a")).list.any()
)
code:py
df.filter(
pl.col("tags").list.eval(pl.element().str.starts_with("a")).list.any()
)
https://gyazo.com/2b34c36e6da5333339c1ee733829c4a3
.filterではなく.selectで見ると意味がわかりやすい
code:py
df.select(
pl.col("tags").list.eval(pl.element().str.contains("^a"))
)
https://gyazo.com/693d0688224082e262e683a182cb6c6c
この結果に対してpolars.Expr.list.any()してる
polars.Expr.list.contains()は要素そのものを含んでいないと無理そう
これだと何もヒットしない
code:py
df.filter(pl.col("tags").list.contains("a"))
code:py
df.filter(pl.col("tags").list.contains("^a"))
ちなみにこれはヒットする
code:py
df.filter(pl.col("tags").list.contains("apple"))
https://gyazo.com/db47eb8dd2e5a4a72dee9a3983e625e4
正規表現は使えず、完全一致じゃないとダメそう(?)
Polarsの文字列操作と一貫してないmrsekut.icon
issueが出てた
https://github.com/pola-rs/polars/issues/9189